function test() : string {
    return "Hello World";
}
console.log( test() );

/**
 * 函数设置默认值
 * @param min number 最小值
 * @param max number 最大值 默认10
 * @returns Array<number>
 *          返回一个数组，包含从min到max的数字。
 *          如果max没有提供，则默认为10。
 *          如果min大于max，则返回一个空数组。
 */
function demo(min : number, max : number = 10) : Array<number> {
    let a : Array<number> = [];
    if ( min > max ) {
        return a;
    }
    for ( let i = min; i <= max; i++ ) {
        a.push( i );
    }
    return a;
}

console.log( demo( 1, 10 ) );

/**
 * 函数参数为可变参数
 * @param num
 * @returns number
 *          返回参数的和。
 *          如果没有参数，则返回0。
 */
function addNumber(...num : number[]) : number {
    let sum : number = 0;
    if ( num.length === 0 ) {
        return sum;
    }
    for ( let i = 0; i < num.length; i++ ) {
        sum += num[i];
    }
    return sum;
}

console.log( "和为：", addNumber( 1, 2, 3, 4, 5 ) );

/**
 * 带参数匿名函数：
 * @param a number
 * @param b number
 * @returns number
 *          返回函数的执行结果。
 */
const resultFunc = (a : number, b : number) => {
    return a + b;
}
console.log( "两个数和为：", resultFunc( 10, 2 ) );


/**
 * 匿名函数的自调用
 */
(function () {
    console.log( "匿名函数" );
})();

/**
 * 构造函数
 */
const myFunc = new Function( "a", "b", "return a + b" );
console.log( "构造函数：", myFunc( 10, 12 ) );


/**
 * 递归函数
 * @param max number
 * @returns number
 *          返回阶乘的值。
 */
function factorial(max : number) : number {
    if ( max === 0 ) return 1;
    return max * factorial( max - 1 );
}
console.log( "阶乘：", factorial( 6 ) );


/**
 * 箭头函数
 * @param x number
 * @returns number
 *          返回x的100倍。
 */
const totalFunc = ( x: number) => {
    return x * 100;
}
console.log( "箭头函数：", totalFunc( 10 ) );


/**
 * 函数重载
 */
function f( a : any, b ?:any  ) {
    console.log( a, b );
}
f( 1 );
f( 1, 2 );

